import env from "@/config/env.js";
import store from "@/store";

// 显示请求错误信息
const showRequestError = (e) => {
  let errMsg = e.errMsg || "系统繁忙！";
  // #ifdef MP-WEIXIN
  if (e.errMsg === "request:fail url not in domain list") {
    errMsg = "当前API域名未添加到微信小程序授权名单";
  }
  // #endif
  if (e.errMsg.startsWith("request:fail")) {
    errMsg = "网络请求错误：请检查请求的API地址能否正常访问";
  }
  uni.showToast({
    title: errMsg,
    icon: "none",
    duration: 3000,
  });
};

// 处理未登录或登录失效的情况
const handleNotLogin = (msg) => {
  store.commit('SET_IS_LOGIN', false)
  store.commit('SET_TOKEN', '')
  store.commit('SET_EMAIL', '')
  uni.removeStorageSync('is_login');
  uni.removeStorageSync('user_info');
  uni.showModal({
    title: "提示",
    content: msg || "请登录后再进行操作",
    success({
      confirm,
      cancel
    }) {
      if (confirm) {
        uni.$u.route({
          type: 'reLaunch',
          url: "/pages/login/index",
        })
      }
      if (cancel) {
        uni.$u.route({
          type: 'tab',
          url: "/pages/index/home/index",
        })
      }
    },
  });
};

const $http = uni.$u.http;

$http.setConfig((config) => {
  /* config 为默认全局配置 */
  config.baseURL = env.baseUrl; // 根域名
  /* 可以加一些自定义参数，在拦截器等地方使用 */
  config.custom = {
    // 如果true就传token
    auth: true,
    // 是否显示加载动画
    loading: true,
  };
  return config;
});

/* 请求拦截器 */
$http.interceptors.request.use(
  (config) => {
    // 可使用async await 做异步操作
    if (config.custom.auth) {
      if (!store.getters.token) {
        handleNotLogin();
        // 如果token不存在，return Promise.reject(config) 会取消本次请求
        return Promise.reject({
          config,
          errMsg: "请登录后再进行操作",
        });
      }
      config.header.authorization = store.getters.token;
    }
    /* 显示加载动画 */
    if (config.custom.loading) {
      uni.showLoading({
        mask: true
      });
    }
    return config;
  },
  (config) => {
    // 可使用async await 做异步操作
    return Promise.reject(config);
  }
);

/* 响应拦截器 */
$http.interceptors.response.use(
  (response) => {
    /* 对响应成功做点什么 可使用async await 做异步操作*/
    if (response.data.code !== 200) {
      if (response.data.code === 401) {
        response.errMsg = "请登录后再进行操作";
        handleNotLogin();
      }
      if (response.data.code === 10001) {
        response.errMsg = "登录已失效，请重新登录后再进行操作";
        handleNotLogin("登录已失效，请重新登录后再进行操作");
      }

      if (response.config.custom.loading) {
        uni.hideLoading();
      }
      showRequestError(response);
      // 服务端返回的状态码不等于200，则reject()
      return Promise.reject(response); // return Promise.reject 可使promise状态进入catch
    }
    /* 关闭加载动画 */
    if (response.config.custom.loading) {
      uni.hideLoading();
    }
    console.log(response);
    return response.data;
  },
  (response) => {
    /*  对响应错误做点什么 （statusCode !== 200）*/
    if (response.config.custom.loading) {
      uni.hideLoading();
    }

    showRequestError(response);
    console.log(response);
    return Promise.reject(response);
  }
);

export default $http;